/*
想用passport模块肯定先要引passport的包，但是除了passport的包，每加一种验证策略就需要再加一个包，正常来说都是需要本地验证策略的，所以就要加passport-local模块，如果想要qq登录，就需要加passport-qq模块，想要其他的就再加其他模块。
下面先介绍本地验证：
passport： https://blog.csdn.net/qq_39807732/article/details/81771948
Node 认证中间件 Passport 学习笔记：https://blog.csdn.net/weixin_41884153/article/details/86772084

*/

const passport = require('koa-passport')
const LocalStrategy = require('passport-local')
const UserModel = require('../../dbs/models/users')

// 设置本地策略：
// 用户校验
passport.use(new LocalStrategy(async function(username,password,done){
    // 查询条件
  let where = {
    username
  };
  // 查找是否有该用户  
  let result = await UserModel.findOne(where)
    
  if(result != null){ //  用户存在
    if(result.password === password) { // 密码正确
      return done(null, result)
    } else {
      return done(null, false, "密码错误")
    }
  } else {
    return done(null,false,"用户不存在")
  }
}))

/* 
    序列化和反序列化的对象是session，是将信息存入session，和将信息从session中取出来。（要存入的变量可以是一个String或者Number或Object）
    序列化函数：serializeUser，在ctx.login(id)函数调用时触发，其中的参数会传给serializeUser函数作为其第一个参数，
    反序列化函数：deserializeUser，会自动解析用户请求中session的信息，并作为回调函数的第一个参数，如果在serializeUser函数中将ID信息存入session，则在这一步回调函数的第一个参数就是ID，在此时可以根据ID查询数据库从而获取用户的更多信息。
 */

//序列化  设置用户每次进到系统时自动让session去校验

/*序列化在ctx.login()函数调用时触发,会自动在ctx.state.user中添加done中的第二个参数，并在session中添加用户登录状态*/
passport.serializeUser(function(user, done){
  done(null, user)
})

// 反序列化 
/*反序列化，会在用户请求到来的时候从session中解析用户信息，如果在登录状态，则在ctx.state.user中添加ctx.login()函数执行时添加进去的参数*/
passport.deserializeUser(function(user, done){
  return done(null, user)
})

// export default passport;
module.exports = passport

